/**
 * 附件上传
 * 
 * @author rain
 */
(function($) {
	// 在文件开始发送前做些异步操作。 WebUploader会等待此异步操作完成后，开始发送文件。
	WebUploader.Uploader.register({
	    'before-send-file': 'beforeSendHook'
	}, {
		beforeSendHook: function( file ) {
			//console.log("before-send-file hood");
	        var me = this,
	            owner = this.owner,
	            server = me.options.server,
	            deferred = WebUploader.Base.Deferred(),
	            opts,image;
	        // maybe control by options.
	        owner.md5File(file.source)
	            // 如果读取出错了，则通过reject告诉webuploader文件上传出错。
	            .fail(function() {deferred.reject();})
	            // md5值计算完成，resolve this promise, webuploader接着往下走。
	            .then(function( md5 ) {
	            	//console.log("file md5===", md5);
	            	file.md5 = md5;
	            	deferred.resolve();
	            });
	        return deferred.promise();
	    }
	});
	
	// art template
	template.defaults.imports.fileSize = function (bytes) {
		return WebUploader.formatSize(bytes);
    };
    template.defaults.imports.dateFormat = function(date, format) {
	    if (typeof date === "string") {
	        var mts = date.match(/(\/Date\((\d+)\)\/)/);
	        if (mts && mts.length >= 3) {
	            date = parseInt(mts[2]);
	        }
	    }
	    date = new Date(date);
	    if (!date || date.toUTCString() == "Invalid Date") {
	        return "";
	    }
	    return date.format(format);
    };
    
    // helper
	$h = {
		compare : function(input, str, exact) {
			return input !== undefined
					&& (exact ? input === str : input.match(str));
		},
		parseFileExt : {
			'doc' : function(ext) {
				return ext.match(/(doc|docx)$/i);
			},
			'xls' : function(ext) {
				return ext.match(/(xls|xlsx)$/i);
			},
			'ppt' : function(ext) {
				return ext.match(/(ppt|pptx)$/i);
			},
			'zip' : function(ext) {
				return ext.match(/(zip|rar|tar|gzip|gz|7z)$/i);
			},
			'htm' : function(ext) {
				return ext.match(/(php|js|css|htm|html)$/i);
			},
			'txt' : function(ext) {
				return ext.match(/(txt|ini|md)$/i);
			},
			'mov' : function(ext) {
				return ext.match(/(avi|mpg|mkv|mov|mp4|3gp|webm|wmv)$/i);
			},
			'mp3' : function(ext) {
				return ext.match(/(mp3|wav)$/i);
			},
			'pdf' : function(ext) {
				return ext.match(/(pdf|swf)$/i);
			},
			'img' : function(ext) {
				return ext.match(/(gif|png|jpe?g)$/i);
			}
		},
		previewFileIconSettings : {
			'doc' : 'fa-file-word-o',
			'xls' : 'fa-file-excel-o',
			'ppt' : 'fa-file-powerpoint-o',
			'img' : 'fa-file-photo-o',
			'pdf' : 'fa-file-pdf-o',
			'zip' : 'fa-file-archive-o',
			'htm' : 'fa-file-code-o',
			'txt' : 'fa-file-text-o',
			'mov' : 'fa-file-movie-o',
			'mp3' : 'fa-file-audio-o'
		},
		isImage : function(vType, vName) {
			return $h.compare(vType, 'image.*')
					|| $h.compare(vName, /\.(gif|png|jpe?g)$/i);
		},
		isViewable: function(vName) {
			return $h.compare(vName, /\.(gif|png|jpg|jpeg|pdf|txt|ini|ppt|pptx|xls|xlsx|doc|docx)$/i);
		},
		/**
		 * 根据文件名和后缀，获取预览图标。
		 */
		getPreviewCls : function(ext) {
		    var cls = $h.previewFileIconSettings[ext.toLowerCase()] || "fa-file-o";
		    $.each($h.parseFileExt, function (key, func) {
		    	if ($h.previewFileIconSettings[key] && func(ext)) {
                    cls = $h.previewFileIconSettings[key];
                }
		    });
		    return cls;
		}		
	};    
	
	$.fn.dtUploader = function(options) {
	    if ( !WebUploader.Uploader.support() ) {
	    	swal("温馨提示", 'Web Uploader 不支持您的浏览器！如果你使用的是IE浏览器，请尝试升级 flash 播放器');
	        throw new Error( 'WebUploader does not support the browser you are using.' );
	    }
	    
	    // options
		options = $.extend(true,{
			viewContainer:"", viewTemplate:"",
			minFileNum: 0, showRemove: true, showRename: true, showDownload: true, showPreview: true,
			showThumbnail: true, thumbnailHover: false,
			urls:{
				remove:'/a/file/rm/',	download:'/a/file/dl/', view:'/a/file/view',	rename:'/a/file/rn'
			},
			data:[] // refer to FileProperties object
		}, options);
		
		// WebUploader Options		
		var wuOptions = $.extend({
			auto: true, resize: false, compress: false,
			thumb: {width: 80, height:80, quality: 90, allowMagnify: true},
			/*swf: '/assets/plugins/webuploader/Uploader.swf',*/
			server: '/a/file/upload'
		}, options.wuOptions||{});
		
		var $this = $(this), $map = {}, // $map保存上传成功以后，服务端的响应数据。
		$inputName = options.name || $this.attr("id"), // Input name
		$list = $(options.viewContainer),
		webUploader = WebUploader.create(wuOptions);
		$this.data('uploader', webUploader);
		$this.data('minFileNum', options.minFileNum);
		
		var fileCount = 0;
		var counter = function(add) {
			if(add) {fileCount++;} else {fileCount--;}
			$this.data('fileCount', fileCount);
		};
		var previewFile = function(file, isRemote/*是否是服务端文件*/) {
			counter(true);
			
			$this.siblings("span.help-block").hide();

		    var cls = $h.getPreviewCls(file.ext);
		    var fname = file.name.replace("."+file.ext, "");
		    var templateOpts = $.extend(false, {cls:cls, fname:fname}, file);
		    $list.append(template.render(options.viewTemplate, templateOpts));
		    var $item = $('#'+file.id);
		    // 编辑已经上传的文件时，创建隐藏域。
		    if (isRemote) $item.prepend('<input type="hidden" name="'+$inputName+'" value="'+file.id+'">');
		    
			if (wuOptions.fileNumLimit == fileCount) {
				// 缩进
				$list.find("div.preview-file-item").removeClass("item-left-indent");
				// 隐藏浏览按钮。
				$(wuOptions.pick.id).hide();
				$this.find("span.status").html("").hide();
			} else {
				$item.addClass("item-left-indent");
			}
		    if (options.showRemove || !isRemote) {
			    $item.find("a.delete").click(function(){
			    	$item.remove();counter(false);
			    	if (!isRemote) webUploader.removeFile(file, true);
			    	// 显示浏览按钮。
					if (wuOptions.fileNumLimit > fileCount) {
						$(wuOptions.pick.id).show(); 
						$list.find("div.preview-file-item").addClass("item-left-indent");
					}
					if (fileCount === 0) {
						$this.siblings("span.help-block").show();
					}
			    	/*if (!isRemote) {
				    	if (file.getStatus() == 'error') { // 上传失败。
				    		$item.remove();counter(false);
				    		// 显示浏览按钮。	
							if (wuOptions.fileNumLimit > fileCount) {
								$(wuOptions.pick.id).show(); 
							}
				    		webUploader.removeFile(file, true);
				    		return;
				    	}
				    	if (file.getStatus() !== 'complete') return;
			    	}
			    	DT.utils.execute("您确定要删除文件 <code>"+file.name+"</code>吗？", options.urls.remove+$map[file.id].fileId, {secret:$map[file.id].secret}, function(resp){
		    			$item.remove();counter(false);
			    		// 显示浏览按钮。
						if (wuOptions.fileNumLimit > fileCount) {
							$(wuOptions.pick.id).show(); 
						}
		    			if (!isRemote) webUploader.removeFile(file, true);		
			    	});*/
			    });
		    } else {
		    	$item.find("a.delete").remove();
		    }
		    if (options.showDownload) {
			    $item.find("a.download").click(function(){
			    	if (!isRemote && file.getStatus() !== 'complete') return;
			    	$(options.downloadIframe).attr("src", options.urls.download+$map[file.id].fileId);
			    });
		    } else {
		    	$item.find("a.download").remove();
		    }
		    if (options.showRename) {
			    $item.find("a.rename").click(function(e){
			    	e.stopPropagation();
			    	if (!isRemote && file.getStatus() !== 'complete') return;
			    	$item.find("span.editable").editable('toggle');
			    });
			    $item.find("span.editable").editable({
		    		type: 'text', emptytext:"空", inputclass: "form-input",
		    		url: options.urls.rename, savenochange: false,
		    		success: function(data){
		    			if(typeof data == 'object' && !data.success) return data.msg;
		    			file.name=data.msg;
		    		},
		    		error: function(xhr) {if(xhr.status == 500 || xhr.status == 404) return '服务忙，请稍后再试。';},
		    		validate: function(v) {if(v == '') return '无效文件名。'}
		    	});
			    $item.find("span.editable").on('shown', function(e, editable) {
			    	$(this).editable('option', {pk: $map[file.id].fileId, params:{ext:file.ext, secret:$map[file.id].secret}});
			    });
		    } else {
		    	$item.find("a.rename").remove();
		    }
		    
		    if (options.showThumbnail) {
			    // image thumbnails
			    var isImageFile = $h.isImage(file.type, file.name),
			    	$thumb = $("#thumb_"+file.id),
			    	callback = function(error, ret) {
			        if (!error) {
			        	$thumb.replaceWith("<img class=\"img-thumbnail\">");
			        	var $img = $item.find("img.img-thumbnail");
			        	$img.attr("alt", file.name);
			        	$img.attr("src", ret);
			        	$item.find("p:last").append(" | " + file._info.width+"x"+file._info.height);
		        		$img.click(function(){
		        			window.open("/a/file/thumb/"+$map[file.id].fileId);
		        		});
		        		
		        		if (options.thumbnailHover) {
				        	// pop up image layer of wu-simple
				        	var xOffset=150,yOffset=5, callback2 = function(e, error, data){
				        		if (!error) {
			 		        		$("#thumbnail_"+file.id).find("img").attr("src", data);
					        		$("#thumbnail_"+file.id)
					        			.css("top",(e.pageY - xOffset) + "px")
					        			.css("left",(e.pageX + yOffset) + "px")
					        			.css("display","block")
					        			.fadeIn("fast");
				        		}
			        		};
		
				        	$img.hover(function(e){
				        		$("body").append("<div id='thumbnail_"+file.id+"' class='thumbnail' style='display:none; position: absolute;'><img /></div>");
				        		if (isRemote) {
				    	        	var url = "/a/file/thumb/"+file.id+"?size=300w";
				                    webUploader.makeThumbFromUrl(url, function(error, data){callback2(e, error, data);}, 300, 300);
				        		} else {
				        			webUploader.makeThumb(file, function(error, data){callback2(e, error, data);}, 300, 300);
				        		}
				            }, function(){$("#thumbnail_"+file.id).remove();});
		        		}
			        } else {
			        	console.log("预览失败");
			        	$thumb.remove();
			        }
			    };
	
			    if(isImageFile && isRemote){ // 预览服务端文件
		        	var url = "/a/file/thumb/"+file.id+"?size="+wuOptions.thumb.width+"x"+wuOptions.thumb.height;
	                webUploader.makeThumbFromUrl(url, callback, wuOptions.thumb.width, wuOptions.thumb.height);
				}
			    if(isImageFile && !isRemote){ // 预览本地文件
			    	webUploader.makeThumb(file, callback, wuOptions.thumb.width, wuOptions.thumb.height);
			    }
			    
			    if (!isImageFile && !$thumb.html()) $thumb.remove();
		    }
		    
		    if ($h.isViewable(file.name) && options.showPreview) {
			    $item.find("a.view").click(function(){
			    	if (isImageFile) {
			    		//var $img = $item.find("img.img-thumbnail");
			    		//$img.click();
			    		window.open("/a/file/thumb/"+$map[file.id].fileId);
			    		return;
			    	}
			    	window.open(options.urls.view+"?fileId="+$map[file.id].fileId);
			    	/*Utils.post({url:options.urls.view+$map[file.id].fileId}, function(data){
			    		Utils.closeWaitLayer();
			    		if (data.success){
			    			window.open("/assets/plugins/pdfjs-dist/web/viewer.html?file=/d/file/view/"+data.obj.url);
			    			return;
			    		}
			    		swal("温馨提示", data.msg);
			    	});*/
			    });
		    } else {$item.find("a.view").remove();}
		};
		
		var $message = {
			Q_EXCEED_NUM_LIMIT:"文件数量超出限制，最多可以选择"+wuOptions.fileNumLimit+"个文件。",
			Q_EXCEED_SIZE_LIMIT:"文件总大小超出限制。最多可以上传"+WebUploader.formatSize(wuOptions.fileSizeLimit),
			Q_TYPE_DENIED:"文件类型不满足要求，或者文件大小为0字节！请重新选择。",
			F_EXCEED_SIZE:"单个文件大小超出限制。最多可以上传"+WebUploader.formatSize(wuOptions.fileSingleSizeLimit),
			F_DUPLICATE:"文件重复上传啦，请重新选择。"
		};
		
		//////////////////////WebUploader Event handler
		webUploader.onError = function( code ) {swal("温馨提示",$message[code]);};
		
		webUploader.on('ready', function(){
			///////////////////// 预览已经上传到服务端的文件。
			var files = options.data || [];
			//console.log(files);
			$.each(files, function(index, file){
				// fixed bugs because column's name is changed in mybatis. 
				/*$.extend(true, file, {id:file.fileid, fileId:file.fileid, lastModifiedDate:file.lastmodifieddate});*/
				$.extend(true, file, {id:file.fileId});
				$map[file.id] = file;
				previewFile(file, true);
				//$('#'+file.id).find("span.uploadstatus").html("上传成功").removeClass("badge-danger").addClass("badge-success");
			});
		});
		
        webUploader.on('beforeFileQueued', function(file){});
		
		webUploader.on('fileQueued', function(file) {previewFile(file, false);});
		
		webUploader.on("uploadStart", function(file){Utils.startPageLoading();});
		
		webUploader.on('uploadBeforeSend', function(block, data, headers) {
           // block为分块数据, file为分块对应的file对象。
           var file = block.file;
           // 将存在file对象中的md5数据携带发送到服务端。
           data.fileMd5 = file.md5;
		});

		// 文件上传过程中创建进度条实时显示。去掉滚动条，避免页面抖动。
		webUploader.on( 'uploadProgress', function( file, percentage ) {
		    //var $li = $( '#'+file.id ), $percent = $li.find('div.progress-bar');
		    // 避免重复创建
		    //if (!$percent.length) {
		    //    $percent = $('<div class="progress progress-u progress-sm"><div class="progress-bar progress-bar-u" role="progressbar"></div></div>')
		    //            .appendTo($li).find('div.progress-bar');
		    //}
		    //$percent.css( 'width', percentage * 100 + '%' );
		});

		// 文件上传成功，给item添加成功class, 用样式标记上传成功。
		webUploader.on( 'uploadSuccess', function( file, response ) {
		    if (response.success) {
		    	$map[file.id] = response.obj;
		    	$file = $( '#'+file.id ); 
			    //$file.find("span.uploadstatus").html("上传成功").removeClass("badge-danger").addClass("badge-success");
			    //上传成功，回写FILEID。Note:删除时需要同时删除这个隐藏域。
			    $file.prepend('<input type="hidden" name="'+$inputName+'" value="'+response.obj.fileId+'">');
			    //webUploader.removeFile(file, true); // do not dequeue. if necessary, may call 'reset' method.
			    // fire uploadSucess event for caller 
			    $("#"+$inputName).trigger("uploadSuccess", response.obj);
		    } else {
		    	swal("温馨提示",response.msg);
		    }
		});

		// 文件上传失败，显示上传出错。
		webUploader.on('uploadError', function( file ) {
		    var $li = $( '#'+file.id ), $error = $li.find('span.uploadstatus');
		    $error.text('上传失败').removeClass("badge-success").addClass("badge-danger");
		    if (options.showDownload) $li.find("a.download").remove();
		    if (options.showRename) {
		    	$li.find("a.rename").remove();
		    	$li.find("span.editable").editable("toggleDisabled");
		    }
		    $li.find("a.view").remove();
		});
		// 服务端响应, 包括服务端文件标识和file.id
		webUploader.on('uploadAccept', function(object, ret){
			// response handler。如果返回false, 则触发uploadError事件。
			if (!ret.success) swal("温馨提示",ret.msg);
			return ret.success;
		});

		// 完成上传完了，成功或者失败，先删除进度条。
		webUploader.on( 'uploadComplete', function( file ) {
		    //$( '#'+file.id ).find('.progress').remove();
		    $this.find("span.status").html("");
		    Utils.stopPageLoading();
		});

		return webUploader;
	};
})(jQuery);